#ifndef __D122_H__
#define __D122_H__

#include "type_def.h"

// Error Table
typedef enum _D122_ERROR
{
    D122ERR_NoError                  =  0, 
    D122ERR_InvalidSwitchCardNumber  = -1, 
    D122ERR_SwitchCardNumberRepeated = -2, 
    D122ERR_MapMemoryFailed          = -3, 
    D122ERR_CardNotExist             = -4, 
    D122ERR_InvalidBoardID           = -5, 
    D122ERR_InvalidParameter1        = -6, 
    D122ERR_InvalidParameter2        = -7, 
    D122ERR_InvalidParameter3        = -8, 
    D122ERR_InvalidParameter4        = -9, 
    D122ERR_InvalidParameter5        = -10, 
    D122ERR_InvalidParameter6        = -11, 
    D122ERR_InvalidParameter7        = -12, 
    D122ERR_InvalidParameter8        = -13, 
    D122ERR_InvalidParameter9        = -14, 
    D122ERR_NotSupported             = -15, 
} D122_ERROR;

typedef enum _D122_CARD_TYPE
{
    CARD_UNKNOWN  = 0, 
    CARD_PCE_D122 = 1, 
    CARD_PCE_D132 = 2, 
    CARD_PCE_D150 = 3, 
    CARD_PCE_D105 = 4, 
} D122_CARD_TYPE;


#ifndef PASCAL
#	define PASCAL __stdcall
#endif

#ifdef __cplusplus
extern "C" {
#endif

I16 PASCAL _d122_open(U16 *ExistCards);
I16 PASCAL _d122_close();
I16 PASCAL _d122_check_switch_card_num(U16 SwitchCardNo, U8 *IsExist);
I16 PASCAL _d122_get_switch_card_num(U16 CardIndex, U16 *SwitchCardNo);
I16 PASCAL _d122_get_card_type(U16 SwitchCardNo, U8* CardType);
I16 PASCAL _d122_get_cpld_version(U16 SwitchCardNo, U16 *CpldVer);

////////////////////////////////////////////////////////////////////////////////
// read / write all
////////////////////////////////////////

// U8 InData[]
//   PCE-D122: InData[4]
//   PCE-D132: InData[6]
//   PCE-D150: InData[10]
//   PCE-D105: NotSupported
I16 PASCAL _d122_read_input(U16 SwitchCardNo, U8 InData[]);

// U8 OutData[]
//   PCE-D122: OutData[4]
//   PCE-D132: OutData[4]
//   PCE-D150: NotSupported
//   PCE-D105: OutData[10]
I16 PASCAL _d122_read_output(U16 SwitchCardNo, U8 OutData[]);
I16 PASCAL _d122_write_output(U16 SwitchCardNo, U8 OutData[]);

////////////////////////////////////////////////////////////////////////////////
// read / write one bit
////////////////////////////////////////

// U8 InBitNo
//   PCE-D122: 0 ~ 31
//   PCE-D132: 0 ~ 47
//   PCE-D150: 0 ~ 79
//   PCE-D105: NotSupported
I16 PASCAL _d122_read_input_bit(U16 SwitchCardNo, U8 InBitNo, U8 *OnOff);

// U8 OutBitNo
//   PCE-D122: 0 ~ 31
//   PCE-D132: 0 ~ 31
//   PCE-D150: NotSupported
//   PCE-D105: 0 ~ 79
I16 PASCAL _d122_read_output_bit(U16 SwitchCardNo, U8 OutBitNo, U8 *OnOff);
I16 PASCAL _d122_write_output_bit(U16 SwitchCardNo, U8 OutBitNo, U8 OnOff);
I16 PASCAL _d122_toggle_output_bit(U16 SwitchCardNo, U8 OutBitNo);

////////////////////////////////////////////////////////////////////////////////
// read / write one byte
////////////////////////////////////////

// U8 PortNo
//   PCE-D122: 0 ~ 7
//   PCE-D132: 0 ~ 9
//   PCE-D150: 0 ~ 9
//   PCE-D105: 0 ~ 9
//
//        D122        D132        D150        D105
// Port0: DI[ 0.. 7]  DI[ 0.. 7]  DI[ 0.. 7]  DO[ 0.. 7]
// Port1: DI[ 8..15]  DI[ 8..15]  DI[ 8..15]  DO[ 8..15]
// Port2: DI[16..23]  DI[16..23]  DI[16..23]  DO[16..23]
// Port3: DI[24..31]  DI[24..31]  DI[24..31]  DO[24..31]
// Port4: DO[ 0.. 7]  DI[32..39]  DI[32..39]  DO[32..39]
// Port5: DO[ 8..15]  DI[40..47]  DI[40..47]  DO[40..47]
// Port6: DO[16..23]  DO[ 0.. 7]  DI[48..55]  DO[48..55]
// Port7: DO[24..31]  DO[ 8..15]  DI[56..63]  DO[56..63]
// Port8:             DO[16..23]  DI[64..71]  DO[64..71]
// Port9:             DO[24..31]  DI[72..79]  DO[72..79]
I16 PASCAL _d122_read_port(U16 SwitchCardNo, U8 PortNo, U8 *Value);
I16 PASCAL _d122_write_port(U16 SwitchCardNo, U8 PortNo, U8 Value);
////////////////////////////////////////////////////////////////////////////////

#ifdef __cplusplus
}
#endif

#endif //__D122_H__
